#ifndef _PROTOCOL_H_
#define _PROTOCOL_H_

#include <stdint.h>
#include <stdbool.h>

/* 协议命令ID */
#define CMD_GET_DEVICE_INFO    0x01
#define CMD_GET_UDISK_INFO     0x02  
#define CMD_GET_FILE_LIST      0x03
#define CMD_MKDIR              0x04
#define CMD_READ_FILE          0x05
#define CMD_WRITE_FILE_START   0x06
#define CMD_WRITE_FILE_DATA    0x07
#define CMD_WRITE_FILE_END     0x08

/* 协议状态机状态 */
typedef enum {
    PROTO_STATE_IDLE = 0,    /* 空闲状态 */
    PROTO_STATE_HEAD1,       /* 帧头1 */
    PROTO_STATE_HEAD2,       /* 帧头2 */ 
    PROTO_STATE_HEAD3,       /* 帧头3 */
    PROTO_STATE_HEAD4,       /* 帧头4 */
    PROTO_STATE_LEN1,        /* 长度1 */
    PROTO_STATE_LEN2,        /* 长度2 */
    PROTO_STATE_LEN3,        /* 长度3 */
    PROTO_STATE_LEN4,        /* 长度4 */
    PROTO_STATE_CMD,         /* 命令字 */
    PROTO_STATE_DATA,        /* 数据 */
    PROTO_STATE_CRC1,        /* CRC校验1 */
    PROTO_STATE_CRC2         /* CRC校验2 */
} proto_state_t;

/* 协议解析器结构体 */
typedef struct {
    proto_state_t state;     /* 当前状态 */
    uint8_t *buf;            /* 数据缓冲区 */
    uint32_t buf_size;       /* 缓冲区大小 */
    uint32_t data_len;       /* 数据长度 */
    uint32_t recv_len;       /* 已接收长度 */
    uint8_t cmd;             /* 命令字 */
    uint16_t crc;            /* CRC校验值 */
} proto_parser_t;

/* 协议解析器初始化 */
void proto_parser_init(proto_parser_t *parser, uint8_t *buf, uint32_t size);

/* 协议状态机处理单个字节 */
bool proto_parse_byte(proto_parser_t *parser, uint8_t byte);

/* 协议打包函数 */
int proto_pack(uint8_t *buf, int buf_size, uint8_t cmd, const uint8_t *data, uint32_t len);

/* CRC16计算函数 */
uint16_t crc16(const uint8_t *data, uint32_t len);

#endif /* _PROTOCOL_H_ */ 